package agb.Modelo;

import java.util.*;


public class EstandarTest {
    
    private ResourceBundle bundle = null;
    
    public EstandarTest() {
    }
    
    public ArrayList getPreguntaTest(){
        int cantPreg;
        cantPreg=Integer.parseInt(getString("NroPreg"));
        ArrayList listaPreg=new ArrayList();
        for(int i=1;i<=cantPreg;i++) listaPreg.add(getString("Preg"+i));
        
        return listaPreg;
    }
    
    public ArrayList getComboCarrera(){
        int cantOpCar;
        cantOpCar=Integer.parseInt(getString("NroOpCar"));
        ArrayList listaOpCar=new ArrayList();
        for(int i=1;i<=cantOpCar;i++) listaOpCar.add(getString("OpCar"+i));
        
        return listaOpCar;
    }
    
    public int getNroInteres(){
        return Integer.parseInt(getString("NroInteres"));
    }
    
    public String getInteres(int op){
        op++;
        return getString("Interes"+op);
    }
    
    public String getDescripcion(int op){
        op++;
        return getString("Descrip"+op);
    }
    
    public ArrayList getCarrerasAfines(int op){
        int cantCar;
        String valorKey="",index=String.valueOf(op+1);
        valorKey="CarPrI"+index;
        cantCar=Integer.parseInt(getString("NroCarP"+index));
        ArrayList listaCarreras=new ArrayList();
        for(int i=1;i<=cantCar;i++) listaCarreras.add(getString(valorKey+i));
        return listaCarreras;
    }
    
    private int getCantPuntaje(ArrayList matrix, int valorBusq, int index){
        int cant=0;
        for(int i=0;i<matrix.size();i++){
            if(getValor(matrix,i,index)==valorBusq) cant++;
        }
        return cant;
    }
    
    private ArrayList getExtraerLista(ArrayList matrix, int valor){
        ArrayList lista=new ArrayList(),lf=null;
        for(int i=0;i<matrix.size();i++){
            if(getValor(matrix,i,1)==valor){
                lf=(ArrayList)matrix.get(i);
                lf.add("0");
                lista.add(lf);
            }
        }
        return lista;
    }
    
    private int getGrupo(int indexInteres){
        int grupo=0;
        switch(indexInteres){
            case 1:
            case 3:
            case 10:
            case 11: grupo=1;
            break;
            case 4:
            case 6:
            case 8:
            case 9: grupo=2;
            break;
            case 5:
            case 7: grupo=3;
            break;
            case 0: grupo=4;
            break;
            case 2: grupo=5;
            break;
        }
        return grupo;
    }
    
    private boolean isMismoGrupo(ArrayList lista){
        boolean estado=false;
        if(getGrupo(getValor(lista,0,0))==getGrupo(getValor(lista,1,0))) estado=true;
        return estado;
    }
    
    private boolean isMismoGrupo(ArrayList lista,int index){
        boolean estado=false;
        int grupo,valor,cont1=0,cont2=0;
        grupo=getGrupo(getValor(lista,index,0));
        valor=getValor(lista,index,2);
        for(int i=index+1;i<lista.size();i++){
            if(valor==getValor(lista,i,2)){
                cont1++;
                if(grupo==getGrupo(getValor(lista,i,0))) cont2++;
            }
        }
        if(cont1==cont2) estado=true;
        return estado;
    }
    
    private int getIndexValorAnterior(int valor, ArrayList matrix){
        int index=-1;
        for(int i=0;i<matrix.size();i++){
            if(valor>getValor(matrix,i,1)){
                index=i;
                break;
            }
        }
        return index;
    }
    
    private int getValor(ArrayList lista, int index1, int index2){
        return Integer.parseInt(((ArrayList)lista.get(index1)).get(index2).toString());
    }
    
    private void setValor(ArrayList lista, int index1, int index2, int valor){
        ArrayList lf=(ArrayList)lista.get(index1);
        lf.set(index2,String.valueOf(valor));
        lista.set(index1, lf);
    }
    
    private void setInicializarLista(ArrayList lista){
        for(int i=0;i<lista.size();i++) setValor(lista,i,2,0);
    }
    
    private void setInicializarLista(ArrayList lista,int index){
        for(int i=0;i<lista.size();i++){
            if(index!=i) setValor(lista,i,2,0);
        }
    }
    
    private boolean isIgualValor(ArrayList lista){
        boolean estado=false;
        int valor,cont=0;
        valor=getValor(lista,0,2);
        for(int i=1;i<lista.size();i++){
            if(getValor(lista,i,2)==valor) cont++;
        }
        if(cont==lista.size()) estado=true;
        return estado;
    }
    
    private boolean isValorRepite(ArrayList lista){
        boolean estado=false;
        int valor,cont=1;
        for(int j=0;j<lista.size();j++){
            cont=1;
            valor=getValor(lista,j,2);
            for(int i=0;i<lista.size();i++){
                if(i!=j && getValor(lista,i,2)==valor) cont++;
            }
            if(cont>1){
                estado=true;
                break;
            }
        }
        return estado;
    }
    
    private boolean isValorRepite(ArrayList lista,int index){
        boolean estado=false;
        int valor,cont=1;
        valor=getValor(lista,index,2);
        for(int i=0;i<lista.size();i++){
            if(i!=index && getValor(lista,i,2)==valor) cont++;
        }
        if(cont>1) estado=true;
        return estado;
    }
    
    private ArrayList getListaCalculada(ArrayList matrix){
        int cant,valor,index=-1,grupo=-1,i=-1,j=-1;
        ArrayList listaPrincipal=null,listaResultado=null,listaSecund=null;
        boolean estado=false,estadoError=false;
        QSort objQSort=new QSort();
        objQSort.setColumna(2);
        valor=getValor(matrix,0,1);
        listaPrincipal=getExtraerLista(matrix,valor);
        cant=getCantPuntaje(matrix,valor,1);
        if(cant>2){
            do{
                estadoError=false;
                index=getIndexValorAnterior(valor,matrix);
                if(index>0){
                    valor=getValor(matrix,index,1);
                    //System.out.println("Valor="+valor);
                    if(valor>25){
                        listaSecund=getExtraerLista(matrix,valor);
                        for(i=0;i<listaSecund.size();i++){
                            grupo=getGrupo(getValor(listaSecund,i,0));
                            for(j=0;j<listaPrincipal.size();j++){
                                if(getGrupo(getValor(listaPrincipal,j,0))==grupo) setValor(listaPrincipal,j,2,getValor(listaPrincipal,j,2)+1);
                            }
                        }
                        //System.out.println("ListaPrincipal="+listaPrincipal);
                        cant=getCantPuntaje(listaPrincipal,0,2);
                        //System.out.println("cant="+cant);
                        if(cant==listaPrincipal.size()){
                            estado=true;
                            setInicializarLista(listaPrincipal);
                        }else{
                            if(isIgualValor(listaPrincipal)){
                                estado=true;
                                setInicializarLista(listaPrincipal);
                            }else{
                                objQSort.setOrdenarDesc(listaPrincipal);
                                if(isValorRepite(listaPrincipal)){
                                    //System.out.println("ListaPrincipal="+listaPrincipal);
                                    if(isValorRepite(listaPrincipal,0)){
                                        estado=true;
                                        setInicializarLista(listaPrincipal);
                                    }else{
                                        if(getValor(listaPrincipal,1,2)>0){
                                            if(isValorRepite(listaPrincipal,1)){
                                                if(isMismoGrupo(listaPrincipal,1)) estado=false;   
                                                else{
                                                    estado=true;
                                                    setValor(listaPrincipal,0,2,20);
                                                    setInicializarLista(listaPrincipal,0);
                                                }
                                            }else estado=false;
                                        }else{
                                            estado=true;
                                            setValor(listaPrincipal,0,2,20);
                                            setInicializarLista(listaPrincipal,0);
                                        }
                                    }
                                }else estado=false;
                            }
                        }
                    }else estadoError=true;
                }else estadoError=true;
                if(estadoError) estado=false;
            }while(estado);
        }else{
            if(!isMismoGrupo(listaPrincipal)){
                do{
                    estadoError=false;
                    index=getIndexValorAnterior(valor,matrix);
                    if(index>0){
                        valor=getValor(matrix,index,1);
                        if(valor>25){
                            listaSecund=getExtraerLista(matrix,valor);
                            for(i=0;i<listaSecund.size();i++){
                                grupo=getGrupo(getValor(listaSecund,i,0));
                                for(j=0;j<listaPrincipal.size();j++){
                                    if(getGrupo(getValor(listaPrincipal,j,0))==grupo) setValor(listaPrincipal,j,2,getValor(listaPrincipal,j,2)+1);
                                }
                            }
                            cant=getCantPuntaje(listaPrincipal,0,2);
                            if(cant==2){ 
                                estado=true;
                                setInicializarLista(listaPrincipal);
                            }else{
                                if(isIgualValor(listaPrincipal)){
                                    estado=true;
                                    setInicializarLista(listaPrincipal);
                                }else{
                                    objQSort.setOrdenarDesc(listaPrincipal);
                                    estado=false;
                                }
                            }
                        }else estadoError=true;
                    }else estadoError=true;
                    if(estadoError) estado=false;
                }while(estado);
            }
        }
        if(estadoError) listaResultado=new ArrayList();
        else listaResultado=getListaResultado(listaPrincipal);
        return listaResultado;
    }
    
    private ArrayList getListaResultado(ArrayList lista){
        int nro=-1,nroResult=Integer.parseInt(getString("NroResultados"));
        ArrayList listaResultado=new ArrayList(),lf=null,dato=null;
        
        if(lista.size()>nroResult) nro=nroResult;
        else nro=lista.size();
        for(int i=0;i<nro;i++){
            dato=(ArrayList)lista.get(i);
            lf=new ArrayList();
            lf.add(dato.get(0));
            lf.add(getInteres(Integer.parseInt(dato.get(0).toString())));
            lf.add(dato.get(1));
            listaResultado.add(lf);
        }
        return listaResultado;
    }
    
    public synchronized ArrayList getResultadoFiltrado(ArrayList matrix){
        ArrayList listaResultado=null;
        int cant=0;
        if(getValor(matrix,0,1)>25){
            cant=getCantPuntaje(matrix,getValor(matrix,0,1),1);
            if(cant<matrix.size()){
                if(cant>1) listaResultado=getListaCalculada(matrix);
                else listaResultado=getListaResultado(matrix);
            }else listaResultado=new ArrayList();
        }else listaResultado=new ArrayList();
        return listaResultado;
    }
    
    private boolean isExisteCarrera(ArrayList lista,String valor){
        boolean estado=false;
        for(int i=0;i<lista.size();i++){
            if(lista.get(i).toString().equals(valor)){
                estado=true;
                break;
            }
        }
        return estado;
    }
    
    public void setAddListaAlternativa(ArrayList lista, String carrera,String opCar){
        if(!opCar.equals("Ninguno")){
            if(carrera.equals(opCar)){
                if(!isExisteCarrera(lista,opCar)) lista.add(opCar);
            }
        }
    }
    
    private ResourceBundle getResourceBundle() {
	if(bundle == null) bundle = ResourceBundle.getBundle("Properties.ConfigSistema");
	return bundle;
    }
    
    private  String getString(String key){
	String value = "0";
	if(bundle == null) {
	    bundle=getResourceBundle();
	}
	try {
	    value = bundle.getString(key);
	}catch (MissingResourceException e) {
	    System.out.println("java.util.MissingResourceException: Couldn't find value for: " + key);
	}
	return value;
    }

    public static void Main(String [] args){
       EstandarTest o = new EstandarTest();
        System.out.println(o.getString("preg1"));
    }
}
